/**
 * 该实例模拟了烧水的过程，涉及三个对象，Heater(热水器),Display（显示器）,Alarm(报警器)。
 * 模拟过程：
 *    为了便于运行，水的初始化温度为90，沸点为95，显示器依据热水器显示温度，显示器显示温度为95时，报警器开始报警。
 *    明显可以看出Heater是subject ,Display 是它的 Obsrver，同时Display亦是suject，因为它要被报警器观察，所以Alarm是Display的Observer。
 * @author MIAO
 * Created on 2011-10-10
 * For more information, please visit:ismiao.com
 */
package com.ismiao.designPattern.Observer.example2;

/**
 * 应用:
 *    1、 对一个对象状态的更新，需要其他对象同步更新，而且其他对象的数量动态可变。
 *    2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
 *    
 * 观察者模式的优点：
 *    1、 Subject和Observer之间是松偶合的，分别可以各自独立改变。
 *    2、 Subject在发送广播通知的时候，无须指定具体的Observer，Observer可以自己决定是否要订阅Subject的通知。
 *    3、 遵守大部分GRASP原则和常用设计原则，高内聚、低偶合。
 * 观察者模式的缺陷：
 *    1、 松偶合导致代码关系不明显，有时可能难以理解。(废话)
 *    2、 如果一个Subject被大量Observer订阅的话，在广播通知的时候可能会有效率问题。（毕竟只是简单的遍历）
 *
 */

public class TestObserver {
	public static void main(String[] args){
		Heater heater = new Heater();
		Display display = new Display();
		Alarm alarm = new Alarm();
		heater.addObserver(display);
		display.addObserver(alarm);
		heater.boilWater();
	}
}
